使用指针的目的可以通过引用地址的方式,将某一对象能够送到其他作用域中进行操作。
使用智能指针可以在一定程度上减少野指针以及内存泄漏的发生,但与此同时,若使用不当则会出现循环引用导致内存泄漏。
使用nullptr
可以将指针值与常量值0
区分开,从而避免运行时出现函数参数类型匹配不当导致问题出现。
指针类型的强化
智能指针( shared_ptr
、 unique_ptr
、 weak_ptr
), 废除 auto_ptr
。
shared_ptr
是一个引用计数智能指针,用于共享对象的所有权也就是说它允许多个指针指向同一个对象。unique_ptr
是“唯一”拥有其所指对象,同一时刻只能有一个unique_ptr指向给定对象,该指针生命周期结束后,会自动调用释放资源。weak_ptr
是为了配合shared_ptr
而引入的一种智能指针,
它指向一个由shared_ptr
管理的对象而不影响所指对象的生命周期,
也就是将一个weak_ptr
绑定到一个shared_ptr
不会改变shared_ptr
的引用计数,常用与破除循环引用。
智能指针系列在声明的方式上与C指针声明并不相同,而是采用类构造函数式声明;
智能指针系列都对 *
和 ->
运算符进行了重载,使用方法与原指针相同。
智能指针是基于引用计数器实现的,因此还可以读取当前有多少指针引用着对象。
关于引用计数器,可以搜索 Object-C
的引用计数进行学习和理解。
shared_ptr
使用概述:
如上代码所示, shared_ptr
在进行赋值时会增加对象的引用,且该智能指针用法简洁明了。
shared_ptr
使用场景:C指针声明的地方都可以使用。
unique_ptr
使用概述:
unique_ptr
指针本身的生命周期:从 unique_ptr
指针创建时开始,直到离开作用域。
离开作用域时,若其指向对象,则将其所指对象销毁(默认使用delete
操作符,用户可指定其他操作)。
unique_ptr指针与其所指对象的关系:在智能指针生命周期内,可以改变智能指针所指对象,
如创建智能指针时通过构造函数指定、通过reset
方法重新指定、通过release
方法释放所有权、通过std::move
移动语义转移所有权。
unique_ptr
使用场景:
空指针值的强化
nullptr
代替了宏定义 NULL
,在某种意义上来说,传统 C++ 会把 NULL
、0
视为同一种东西,这取决于编译器如何定义 NULL
,
有些编译器会将 NULL
定义为 ((void*)0)
,有些则会直接将其定义为 0
。